package com.zoe.onelink.auth.property;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.HashSet;
import java.util.Set;

/**
 * <p>标题: </p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2021</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: ruansheng
 * @date: 2021-11-18
 */
@Data
@ConfigurationProperties(prefix = OnelinkAuthProperties.PREFIX)
public class OnelinkAuthProperties {

    public static final String PREFIX = "onelink.auth";

    /**
     * 开启token权限验证
     */
    private boolean enabled = true;

    /**
     * 权限验证策略
     */
    private Strategy strategy = Strategy.CIRCUIT_BREAKER;

    /**
     * 验证请求时间
     */
    private boolean validateCallTime = false;

    /**
     * CallTime有效时间(默认2分钟)
     */
    private Duration callTimeExpiration = Duration.ofMillis(2);

    /**
     * TOKEN容错机制,默认实现: Redis服务不可用时直接通过token解析出用户编码查数据库
     */
    private boolean tokenFallbackEnabled = true;

    /**
     * token加密密钥 (与门户保持一致)
     */
    private String tokenSecretKey = "5XWAyRAr0Q72jAdiYP0QOA==";

    /**
     * 白名单列表(支持Spring通配符)
     */
    private Set<String> permitUrls = new HashSet<>();

    /**
     * 黑名单列表(支持Spring通配符)
     */
    private Set<String> denyUrls = new HashSet<>();

    /**
     * 本地缓存
     */
    private LocalCache localCache = new LocalCache();

    @Data
    public static class LocalCache {

        /**
         * 开启本地缓存
         */
        private boolean enabled = true;

        /**
         * 本地缓存过期时间(默认10秒)
         */
        private Duration expiredTime = Duration.of(10, ChronoUnit.SECONDS);

    }

    public enum Strategy {

        /**
         * 基于加密算法直接解析
         */
        ENCRYPT_ALGORITHM,

        /**
         * 基于Redis验证
         */
        REDIS,

        /**
         * 基于Redis和本地缓存
         */
        REDIS_AND_LOCAL_CACHE,

        /**
         * 基于熔断器
         */
        CIRCUIT_BREAKER,
    }

}
